package tec;
import java.util.ArrayList;
import java.util.ListIterator;

class Autobus implements Bus
{

	private ArrayList<Passager> passagers;
	private JaugeNaturel jaugeAssis;
	private JaugeNaturel jaugeDebout;
	protected int arretActuel;
	private ListIterator itr; 

	public Autobus(int nbAssis, int nbDebout) 
	{
		if(nbAssis < 0 || nbDebout < 0)
			throw new IllegalArgumentException("nombre de passager negatif");

		jaugeAssis = new JaugeNaturel(-1,nbAssis,0);
		jaugeDebout = new JaugeNaturel(-1,nbDebout,0);
		arretActuel = 0;
		passagers = new ArrayList<Passager>(nbAssis+nbDebout);
	}

	public boolean aPlaceAssise () 
	{
		return !jaugeAssis.estRouge();
	} 	

	public boolean aPlaceDebout () 
	{
		return !jaugeDebout.estRouge();
	}

	public void allerArretSuivant() throws TecInvalidException 
	{
		arretActuel++;

		for (Passager p : passagers)
			p.nouvelArret(this, arretActuel);
		passagers.remove(null);
	}

	public void demanderChangerEnAssis(Passager p) 
	{
		if(p.estAssis())
			throw new IllegalStateException("passager deja assis");
		if(!jaugeAssis.estRouge()){
			jaugeAssis.incrementer();
			jaugeDebout.decrementer();
			p.accepterPlaceAssise();
		}	
	}

	public void demanderChangerEnDebout(Passager p)
	{
		if(p.estDebout())
			throw new IllegalStateException("passager deja debout");

		if(!jaugeDebout.estRouge()){
			jaugeDebout.incrementer();
			jaugeAssis.decrementer();
			p.accepterPlaceDebout();
		}
	}

	public void demanderPlaceAssise(Passager p) 
	{
		if(p.getDestination() <= arretActuel)
			throw new IllegalStateException("destination depassee");

		if(!jaugeAssis.estRouge()){
			jaugeAssis.incrementer();
			passagers.add(passagers.size(), p);
			p.accepterPlaceAssise();
		}
	}

	public void demanderPlaceDebout(Passager p) 
	{
		if(p.getDestination() <= arretActuel)
			throw new IllegalStateException("destination depasse");

		if(!jaugeDebout.estRouge()){
			jaugeDebout.incrementer();
			passagers.add(passagers.size(), p);
			p.accepterPlaceDebout();
		}
	}

	public void demanderSortie(Passager p) 
	{
		if(p.estDehors())
			throw new IllegalStateException("passager déjà dehors");

		itr = passagers.listIterator();

		if(p.estAssis())
			jaugeAssis.decrementer();
		else if (p.estDebout())
			jaugeDebout.decrementer();

		while(itr.hasNext() && itr.next() != p);
		passagers.set(itr.previousIndex(), null);
		p.accepterSortie();
	}

	@Override
		public String toString(){
			return "[arret:" + arretActuel + ", assis:" 
				+ jaugeAssis.toString() + ", debout:" 
				+ jaugeDebout.toString() + "]";
		}
}


